#include <iostream>
#include <string>

using namespace std;

/*
左操作数 + 右操作数
左操作数.operator+(右操作数);

成员函数
    const 类<类型> operator+(右操作数);
全局函数
    const 类<类型> operator+(左操作数 , 右操作数);
*/

class My_int
{
private:
    int val;

public: // 构造函数
    My_int() { this->val = 0; }

    My_int(int val) : val(val) {}

    ~My_int() {}

public:
    void show()
    {
        cout << "val = " << this->val << endl;
    }

public:
    // 成员函数 运算符重载
    // // 运算符重载 +
    // const My_int operator+(const My_int & val ) const
    // {
    //     int temp = this->val - val.val;
    //     return My_int(temp);
    // }

    // // 运算符重载 +
    // const My_int operator+(const int val) const
    // {
    //     int temp = this->val - val;
    //     return My_int(temp);
    // }

    friend const My_int operator+(My_int &O, My_int &R);

    friend const My_int operator+(My_int &O, int val);

};

// 全局函数 运算符重载
// 运算符重载 +
const My_int operator+(My_int &O, My_int &R)
{
    int temp = O.val + R.val;
    return My_int(temp);
}

// 运算符重载 +
const My_int operator+(My_int &O, int val)
{
    int temp = O.val + val;
    return My_int(temp);
}

int main(int argc, char const *argv[])
{
    My_int val_1(10);
    My_int val_2(10);
    My_int val_3(10);

    val_1.show();
    val_2.show();
    val_3.show();

    // 使用运算附重载
    val_1 = val_2 + 80;
    val_1.show();

    val_1 = val_2 + val_3;
    val_1.show();

    return 0;
}
